package com.example.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.locks.ReentrantLock;

/**
 * SerialNumberUtils类用于生成唯一的流水号
 */
public class SerialNumberUtils {

    /**
     * 记录初始值
     */
    public static int num = 0;

    //用于保证线程安全的锁
    private static ReentrantLock lock = new ReentrantLock();

    /**
     * 获取唯一的流水号
     * <p>
     * 此方法的目的是生成一个唯一的、格式化的流水号
     * 它通过记录当天已生成的流水号数量，并根据这个数量生成下一个流水号
     * 使用锁来确保在并发情况下流水号的唯一性和顺序性
     *
     * @return 唯一的流水号字符串
     */
    public static String getNum() {
        String unique = "";
        //上锁
        lock.lock();
        try {
            //------------------流水号业务逻辑----------------
            //5位流水号
            if (num == 0) {
                //当天第一份流水单号
                unique = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "0000000001";
            } else {
                //当天最后的订单流水号累加1
                String nums = String.valueOf(num + 1);
                //设定具体流水为十位数，单数则补齐前面的0
                StringBuilder sb = new StringBuilder(nums);
                for (int i = nums.length(); i < 10; i++) {
                    sb.insert(0, "0");
                }
                unique = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + sb.toString();
            }
            //已有流水单+1
            num++;
            //----------------------------------
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放锁
            lock.unlock();
        }
        return unique;
    }
}
